Fix map_pages_to_xen() to atomically switch between valid mappings.
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Sun, 15 Apr 2007 20:56:38 +0000 (21:56 +0100)
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Sun, 15 Apr 2007 20:56:38 +0000 (21:56 +0100)
This is needed to successfully boot a debug=y build of xen on kvm.
Reported by Jeremy Fitzhardinge <jeremy@goop.org>
Signed-off-by: Avi Kivity <avi@qumranet.com>
Signed-off-by: Keir Fraser <keir@xensource.com>
xen/arch/x86/mm.c

index ce49f743fe895240ad2b8c004730cf113a702ea5..1c1620d5e52c15ea441540ea1824c562693d0bdc 100644 (file)
@@ -3424,7 +3424,7 @@ int map_pages_to_xen(
         {
             /* Super-page mapping. */
             ol2e = *pl2e;
-            l2e_write(pl2e, l2e_from_pfn(mfn, flags|_PAGE_PSE));
+            l2e_write_atomic(pl2e, l2e_from_pfn(mfn, flags|_PAGE_PSE));
 
             if ( (l2e_get_flags(ol2e) & _PAGE_PRESENT) )
             {
@@ -3454,14 +3454,14 @@ int map_pages_to_xen(
                     l1e_write(&pl1e[i],
                               l1e_from_pfn(l2e_get_pfn(*pl2e) + i,
                                            l2e_get_flags(*pl2e) & ~_PAGE_PSE));
-                l2e_write(pl2e, l2e_from_pfn(virt_to_mfn(pl1e),
-                                             __PAGE_HYPERVISOR));
+                l2e_write_atomic(pl2e, l2e_from_pfn(virt_to_mfn(pl1e),
+                                                    __PAGE_HYPERVISOR));
                 local_flush_tlb_pge();
             }
 
             pl1e  = l2e_to_l1e(*pl2e) + l1_table_offset(virt);
             ol1e  = *pl1e;
-            l1e_write(pl1e, l1e_from_pfn(mfn, flags));
+            l1e_write_atomic(pl1e, l1e_from_pfn(mfn, flags));
             if ( (l1e_get_flags(ol1e) & _PAGE_PRESENT) )
                 local_flush_tlb_one(virt);